package cl.portal.escolares.action;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import cl.portal.escolares.DAO.DAOAlumno;
import cl.portal.escolares.DAO.DAOApoderado;
import cl.portal.escolares.DAO.DAOColegio;
import cl.portal.escolares.DAO.DAOCurso;
import cl.portal.escolares.DAO.DAOFormaPago;
import cl.portal.escolares.DAO.DAOFurgon;
import cl.portal.escolares.DAO.DAOPago;
import cl.portal.escolares.DAO.DAOUsuario;
import cl.portal.escolares.domain.Alumno;
import cl.portal.escolares.domain.Apoderado;
import cl.portal.escolares.domain.Colegio;
import cl.portal.escolares.domain.Curso;
import cl.portal.escolares.domain.FormaPago;
import cl.portal.escolares.domain.Furgon;
import cl.portal.escolares.domain.Pago;
import cl.portal.escolares.domain.Usuario;
import cl.portal.escolares.sheduler.Constants;

import com.opensymphony.xwork2.ActionSupport;

public class AlumnoSaveAction extends ActionSupport {
	private static final long serialVersionUID = 1L;
	private static Log _log = LogFactory.getLog(AlumnoSaveAction.class);

	private Long existOrNew;
	private Apoderado apoderado;
	private Alumno alumno;
	private Usuario usuario;
	private List<Alumno> alumnos;
	private List<Furgon> furgones;
	private List<Colegio> colegios;
	private List<Curso> cursos;
	private List<Pago> pagos;
	private Long montoMensual;
	private Long cantidadPago;
	private String pagosPendientes;
	private String pagosRealizados;
	private int[] diasPago = Constants.cantidadPagos;
	private int[] cantidadPagos=Constants.cantidadPagos;
	private Curso curso;
	private Colegio colegio;
	private List<FormaPago> formasPago;
	private HashMap<Long, String> formasPagoMap;

	private String okMessage = "";
	private String errorMessage = "";
	private String fechaNacimiento = "";
	private HashMap<Long, String> fechaMap;
	private HashMap<Long, String> fechaPagoMap;

	public String execute() throws Exception {

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		SimpleDateFormat sd = new SimpleDateFormat("dd/MM/yyyy");
		Date fechaActual = sdf.parse(sdf.format(new Date()));
		Date fechaNacmto = null;

		fechaMap = new HashMap<Long, String>();
		fechaPagoMap = new HashMap<Long, String>();
		formasPagoMap = new HashMap<Long, String>();
		try {
			fechaNacmto = sd.parse(fechaNacimiento);
			fechaNacmto = sdf.parse(sdf.format(fechaNacmto));
		} catch (ParseException ex) {
			ex.printStackTrace();
		}
		try {
			setUsuario(DAOUsuario.get(alumno.getUsuarioId()));
			setApoderado(DAOApoderado.get(alumno.getApoderadoId()));

			formasPago = DAOFormaPago.list();

			for (FormaPago fp : formasPago)
				formasPagoMap.put(fp.getFormaPagoId(), fp.getDescripcion());

			if (null == alumno.getAlergias())
				alumno.setAlergias("");
			if (null == alumno.getSistemaSalud())
				alumno.setSistemaSalud("");
			if (null == alumno.getObservacion())
				alumno.setObservacion("");

			if (getExistOrNew() == 1) {

				Alumno objeto = DAOAlumno.get(alumno.getAlumnoId());
				objeto.setFurgonId(alumno.getFurgonId());
				objeto.setCursoId(alumno.getCursoId());
				objeto.setRut(alumno.getRut());
				objeto.setNombres(alumno.getNombres());
				objeto.setApellidos(alumno.getApellidos());
				objeto.setFechaNacimiento(fechaNacmto);
				objeto.setTelefono(alumno.getTelefono());
				objeto.setDireccion(alumno.getDireccion());
				objeto.setDireccionEmergencia(alumno.getDireccionEmergencia());
				objeto.setAlergias(alumno.getAlergias());
				objeto.setSistemaSalud(alumno.getSistemaSalud());
				objeto.setAnualidad(alumno.getAnualidad());
				objeto.setObservacion(alumno.getObservacion());
				objeto.setUltimaModificacion(fechaActual);
				DAOAlumno.update(objeto);
				setCurso(DAOCurso.get(alumno.getCursoId()));
				setColegio(DAOColegio.get(curso.getColegioId()));
				setFurgones(DAOFurgon.list(usuario.getUsuarioId(), null, true));
				setColegios(DAOColegio.list(null));
				setCursos(DAOCurso.list(colegio.getColegioId(), null));
				List<Pago> pagos = DAOPago.list(usuario.getUsuarioId(),
						alumno.getAlumnoId(), null, null, null, null, null,
						null, true);
				setPagos(null != pagos ? pagos : new ArrayList<Pago>());
				for (Pago p : pagos) {

					fechaMap.put(p.getPagoId(), sd.format(p.getFecha()));
					if(null!=p.getFechaPago())
					fechaPagoMap
							.put(p.getPagoId(), sd.format(p.getFechaPago()));

				}

				setFechaMap(fechaMap);
				setFechaPagoMap(fechaPagoMap);

				setPagosPendientes("1");// crear logica de calculo de pagos
										// pendientes y realizados
				setPagosRealizados("1");
				setOkMessage("Datos Actualizados Satisfactoriamente.");
				setErrorMessage("");

				return "successExist";
			} else {
				Alumno objeto = new Alumno();
				objeto.setUsuarioId(usuario.getUsuarioId());
				objeto.setApoderadoId(alumno.getApoderadoId());
				objeto.setFurgonId(alumno.getFurgonId());
				objeto.setCursoId(alumno.getCursoId());
				objeto.setRut(alumno.getRut());
				objeto.setNombres(alumno.getNombres());
				objeto.setApellidos(alumno.getApellidos());
				objeto.setFechaNacimiento(fechaNacmto);
				objeto.setTelefono(alumno.getTelefono());
				objeto.setDireccion(alumno.getDireccion());
				objeto.setDireccionEmergencia(alumno.getDireccionEmergencia());
				objeto.setAlergias(alumno.getAlergias());
				objeto.setSistemaSalud(alumno.getSistemaSalud());
				objeto.setAnualidad(alumno.getAnualidad());
				objeto.setObservacion(alumno.getObservacion());
				objeto.setFechaCreacion(fechaActual);
				objeto.setUltimaModificacion(fechaActual);
				objeto.setActivo(true);

				DAOAlumno.add(objeto);
				setAlumno(objeto);
				if (null != getCantidadPago() && getCantidadPago() > 0) {
					int mes = 12;
					SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
					Calendar calendar = Calendar.getInstance();
					for (int i = 0; i < getCantidadPago(); i++) {

						Pago pago = new Pago();
						pago.setUsuarioId(usuario.getUsuarioId());
						pago.setAlumnoId(objeto.getAlumnoId());
						pago.setApoderadoId(apoderado.getApoderadoId());
						pago.setFormaPagoId(0L);
						pago.setMonto(getMontoMensual());
						pago.setTipo(Constants.PAGO_MENSUALIDAD);
						pago.setNotificado(0L);
						pago.setRutaPDF("");
						pago.setFecha(sdf1.parse(calendar.get(Calendar.YEAR)
								+ "-" + mes + "-" + apoderado.getDiaPago()));
						pago.setFolioComprobante(0L);
						pago.setPagado(false);
						pago.setActivo(true);
						DAOPago.add(pago);

						mes--;
					}
				}
				setCurso(DAOCurso.get(alumno.getCursoId()));
				setColegio(DAOColegio.get(curso.getColegioId()));
				setFurgones(DAOFurgon.list(usuario.getUsuarioId(), null, true));
				setColegios(DAOColegio.list(true));
				setCursos(DAOCurso.list(colegio.getColegioId(), null));

				List<Pago> pagos = DAOPago.list(usuario.getUsuarioId(),
						alumno.getAlumnoId(), alumno.getApoderadoId(), null,
						null, null, null, null, true);
				_log.info(pagos.size());
				setPagos(null != pagos ? pagos : new ArrayList<Pago>());
				for (Pago p : pagos) {
					fechaMap.put(p.getPagoId(), sd.format(p.getFecha()));
					if (null != p.getFechaPago())
						fechaPagoMap.put(p.getPagoId(),
								sd.format(p.getFechaPago()));

				}
				setFechaMap(fechaMap);
				setFechaPagoMap(fechaPagoMap);
				setPagosPendientes("1");// crear logica de calculo de pagos
										// pendientes y realizados
				setPagosRealizados("1");
				setOkMessage("Alumno Guardado Correctamente.");
				setErrorMessage("");

				return "success";

			}
		} catch (Exception e) {
			_log.error(e);
			setErrorMessage("Se ha producido un error inesperado.");
			setOkMessage("");
			addActionError(getText("error.login"));
			return "error";
		}
	}

	public Curso getCurso() {
		return curso;
	}

	public void setCurso(Curso curso) {
		this.curso = curso;
	}

	public Colegio getColegio() {
		return colegio;
	}

	public void setColegio(Colegio colegio) {
		this.colegio = colegio;
	}

	public static Log get_log() {
		return _log;
	}

	public static void set_log(Log _log) {
		AlumnoSaveAction._log = _log;
	}

	public Long getExistOrNew() {
		return existOrNew;
	}

	public void setExistOrNew(Long existOrNew) {
		this.existOrNew = existOrNew;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	public Alumno getAlumno() {
		return alumno;
	}

	public void setAlumno(Alumno alumno) {
		this.alumno = alumno;
	}

	public List<Furgon> getFurgones() {
		return furgones;
	}

	public void setFurgones(List<Furgon> furgones) {
		this.furgones = furgones;
	}

	public List<Colegio> getColegios() {
		return colegios;
	}

	public void setColegios(List<Colegio> colegios) {
		this.colegios = colegios;
	}

	public List<Curso> getCursos() {
		return cursos;
	}

	public void setCursos(List<Curso> cursos) {
		this.cursos = cursos;
	}

	public int[] getDiasPago() {
		return diasPago;
	}

	public void setDiasPago(int[] diasPago) {
		this.diasPago = diasPago;
	}

	public String getOkMessage() {
		return okMessage;
	}

	public void setOkMessage(String okMessage) {
		this.okMessage = okMessage;
	}

	public String getErrorMessage() {
		return errorMessage;
	}

	public void setErrorMessage(String errorMessage) {
		this.errorMessage = errorMessage;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public List<Pago> getPagos() {
		return pagos;
	}

	public void setPagos(List<Pago> pagos) {
		this.pagos = pagos;
	}

	public Apoderado getApoderado() {
		return apoderado;
	}

	public void setApoderado(Apoderado apoderado) {
		this.apoderado = apoderado;
	}

	public String getPagosPendientes() {
		return pagosPendientes;
	}

	public void setPagosPendientes(String pagosPendientes) {
		this.pagosPendientes = pagosPendientes;
	}

	public String getPagosRealizados() {
		return pagosRealizados;
	}

	public void setPagosRealizados(String pagosRealizados) {
		this.pagosRealizados = pagosRealizados;
	}

	public List<Alumno> getAlumnos() {
		return alumnos;
	}

	public void setAlumnos(List<Alumno> alumnos) {
		this.alumnos = alumnos;
	}

	public String getFechaNacimiento() {
		return fechaNacimiento;
	}

	public void setFechaNacimiento(String fechaNacimiento) {
		this.fechaNacimiento = fechaNacimiento;
	}

	public Long getMontoMensual() {
		return montoMensual;
	}

	public void setMontoMensual(Long montoMensual) {
		this.montoMensual = montoMensual;
	}

	public Long getCantidadPago() {
		return cantidadPago;
	}

	public void setCantidadPago(Long cantidadPago) {
		this.cantidadPago = cantidadPago;
	}

	public List<FormaPago> getFormasPago() {
		return formasPago;
	}

	public void setFormasPago(List<FormaPago> formasPago) {
		this.formasPago = formasPago;
	}

	public HashMap<Long, String> getFormasPagoMap() {
		return formasPagoMap;
	}

	public void setFormasPagoMap(HashMap<Long, String> formasPagoMap) {
		this.formasPagoMap = formasPagoMap;
	}

	public HashMap<Long, String> getFechaMap() {
		return fechaMap;
	}

	public void setFechaMap(HashMap<Long, String> fechaMap) {
		this.fechaMap = fechaMap;
	}

	public HashMap<Long, String> getFechaPagoMap() {
		return fechaPagoMap;
	}

	public void setFechaPagoMap(HashMap<Long, String> fechaPagoMap) {
		this.fechaPagoMap = fechaPagoMap;
	}

	public int[] getCantidadPagos() {
		return cantidadPagos;
	}

	public void setCantidadPagos(int[] cantidadPagos) {
		this.cantidadPagos = cantidadPagos;
	}

}
